home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / SWAG / SWAGA_C / COMM.SWG / 0043_Reading UART baud rate....pas < prev    next >
Pascal/Delphi Source File  |  1994-05-25  |  3KB  |  62 lines

  1.  
  2. {
  3.  Here's a TP function that will report the current UART baud rate for
  4.  any serial port device (modem, mouse, etc.) ...
  5. }
  6.  
  7. (*************************** GETBAUD.PAS ***************************)
  8. PROGRAM GetBaud;                      { compiler: Turbo Pascal 4.0+ }
  9.                                       { Mar.23.94 Greg Vigneault    }
  10.  
  11. (*-----------------------------------------------------------------*)
  12. { get the current baud rate of a serial i/o port (reads the UART)...}
  13.  
  14. FUNCTION SioRate (ComPort :WORD; VAR Baud :LONGINT) :BOOLEAN;
  15.   CONST DLAB = $80;                   { divisor latch access bit    }
  16.   VAR   BaseIO,                       { COM base i/o port address   }
  17.         BRGdiv,                       { baud rate generator divisor }
  18.         regDLL,                       { BRG divisor, latched LSB    }
  19.         regDLM,                       { BRG divisor, latched MSB    }
  20.         regLCR :WORD;                 { line control register       }
  21.   BEGIN
  22.     Baud := 0;                                { assume nothing      }
  23.     IF (ComPort IN [1..4]) THEN BEGIN         { must be 1..4        }
  24.       BaseIO := MemW[$40:(ComPort-1) SHL 1];  { fetch base i/o port }
  25.       IF (BaseIO <> 0) THEN BEGIN             { has BIOS seen it?   }
  26.         regDLL := BaseIO;                     { BRGdiv, latched LSB }
  27.         regDLM := BaseIO + 1;                 { BRGdiv, latched MSB }
  28.         regLCR := BaseIO + 3;                 { line control reg    }
  29.         Port[regLCR] := Port[regLCR] OR DLAB;         { set DLAB    }
  30.         BRGdiv := WORD(Port[regDLL]);                 { BRGdiv LSB  }
  31.         BRGdiv := BRGdiv OR WORD(Port[regDLM]) SHL 8; { BRGdiv MSB  }
  32.         Port[regLCR] := Port[regLCR] AND NOT DLAB;    { reset DLAB  }
  33.         IF (BRGdiv <> 0) THEN
  34.           Baud := 1843200 DIV (LONGINT(BRGdiv) SHL 4);  { calc bps  }
  35.       END; {IF BaseIO}
  36.     END; {IF ComPort}
  37.     SioRate := (Baud <> 0);                   { success || failure  }
  38.   END {SioRate};
  39.  
  40. (*-----------------------------------------------------------------*)
  41.  
  42. VAR ComPort : WORD;                         { will be 1..4          }
  43.     Baud    : LONGINT;                      { as high as 115200 bps }
  44.  
  45. BEGIN {GetBaud}
  46.  
  47.   REPEAT
  48.     WriteLn; Write ('Read baud rate for which COM port [1..4] ?: ');
  49.     ReadLn (ComPort);
  50.     IF NOT SioRate (ComPort, Baud) THEN BEGIN
  51.       Write ('!',CHR(7)); {!beep}
  52.       CASE ComPort OF
  53.         1..4 : WriteLn ('COM',ComPort,' is absent; try another...');
  54.         ELSE WriteLn ('Choose a number: 1 through 4...');
  55.       END; {CASE}
  56.     END; {IF}
  57.   UNTIL (Baud <> 0);
  58.  
  59.   WriteLn ('-> COM',ComPort,' is set for ',Baud,' bits-per-second');
  60.  
  61. END {GetBaud}.
  62.